1.API概述
  API(Application Programming Interface) 应用程序接口
  Java API 其实别人预先定义好了一些类和接口,我们无需了解这些类和接口的内部实现细节
  直接去使用它们即可(面向对象思想)
  Scanner:接收键盘录入数据 java.util.Scanner
   Scanner.java
   Scanner.class
  Java API文档: 它其实是别人写好的类或接口的说明书
2.Object类
 a.toString()方法
   1.默认的toString()方法
          /*
      //Object类中toString()方法
  *   public String toString() {
          return getClass().getName() + "@" + Integer.toHexString(hashCode());
      }
  *  this.getClass().getName()://p.getClass().getName() //object01.Person.class
                               //object01.Person 包名+类名
  *
  *   "@"
  *
  *  Integer.toHexString(hashCode()):将对象的内存地址换算成一个哈希值,然后再转换成十六进制的形式
     简单理解为:产生了一个十六进制的内存地址
      "4554617c"
  *
  *  最终: 类的完整名称+"@"+该对象的十六进制内存地址值
        object01.Person @ 4554617c

  * */
     2.重写后的toString()方法
  /**
   * 由于Object类中的默认的toString()方法返回对象的地址值的十六进制形式
   * 对于我们实际需求没有任何意义,因此我们一般重写掉默认的toString()方法
   * 重写标准:
   *    我们一般返回对象中所有属性的拼接字符串
   */
      /*@Override
      public String toString() {
          return "姓名="+name+",年龄="+age;
      }*/

  b.equals()方法
    1.默认的equals()方法:比较的是两个对象的地址值
    /**
     * public boolean equals(Object obj) {
     *         return (this == obj);
     * }
     * ==比较运算符
     *   a.基本数据类型比较的是两个基本类型的数值
     *      int i=3;
     *      int j=11;
     *      i==j //false
     *   b.引用数据类型比较的是两个引用中的地址值
     *
     *
     *
     *
     * 1.obj=p2=new Person("佟大为", 29);
     *   this=p1=new Person("谢霆锋", 30);
     *   p1==p2//由于p1指向new Person("谢霆锋", 30),假设地址值为0x4C
     *         //p2指向new Person("佟大为", 29);假设地址值为0x5B
     *         //由于两者的内存地址值不同,所以返回false
     * 2.obj=p1=new Person("谢霆锋", 30);
     *   this=p1=new Person("谢霆锋", 30);
     *   p1==p1//由于p1指向new Person("谢霆锋", 30),假设地址值为0x4C
     *          //因此p1的内存地址值==p1的内存地址值 返回true
     *
     *
     */
   2.重写equals()方法:比较这两个对象中的所有属性,如果所有属性值均相同,则返回true,如果有一个属性不同,就返回false
    /**
     * 1.如果传递过来的两个对象是同一个对象(同一个人)直接return true
     * 2.如果传递的一个是人对象,一个是非Person类对象,直接return false
     * 3.如果传递的是两个人对象,而且不是同一个人,接着就要进行强转,然后去比较这两个人姓名和年龄
     *
     * @param o
     * @return
     */
    @Override
    public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof Person)) return false;
            Person person = (Person) o;
            return age == person.age &&
            name.equals(person.name);
            }


        /*@Override
        public boolean equals(Object obj) {//Object obj=a=new Animal();
                                           //父类引用指向子类对象 多态

            if (this == obj) { //this=p2
                               //obj=p2
                               //p2==p2 true
                return true;   //直接return true,如果是同一个人,我们就不走下面的比较姓名和年龄代码
                             //提高代码效率
            }


            if(!(obj instanceof Person)){//如果obj引用指向的对象不是Person类的对象
                                       //那么我们就return false
                return false;
            }

            Person p=(Person)obj;

            return this.age == p.age && this.name.equals(p.name);
        }*/

3.String类
  a.String类的特点
    /**
     * String 类代表字符串。Java 程序中的所有字符串字面值（如 "abc" ）都作为此类的实例实现。
     * 字符串是常量；它们的值(双引号括起来)在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的，所以可以共享
     */
  b.String类构造方法和equals方法
    /**
     * String类构造方法
     * String(String original)
     *           初始化一个新创建的 String 对象，使其表示一个与参数相同的字符序列；
     *
     * toString():由于打印String类的引用没有打印内存地址值的十六进制形式,说明String类一定重写了toString()方法
     *            重写的toString()方法返回的是字符串内容
     *
     * boolean equals(Object anObject)//equals方法也被String类重写了,不在去比较内存地址值,而是比较两个字符串对象的内容
     */
  c.String类的面试题
    1.常量池:它是方法区一块空间,它只存储常量(基本类型常量和字符串常量)
            如果常量池已经存在该常量,那么新的内容相同的常量就不在存储到常量池
    2.== 与 boolean equals(Object obj)
      ==如果是基本类型比较的是数值,如果是引用类型比较的是地址值
      equals()方法
          如果使用Object类中默认的equals()方法,比较的两个对象的地址值
          如果重写了Object类中默认的equals()方法,那么按照重写规则比较(String类 equals()方法比较字符串内容)
  d.字符串的转换功能
    1.字符数组转换为字符串
        /**
         *String(char[] value)
         *           分配一个新的 String，使其表示字符数组参数中当前包含的字符序列。
         * String(char[] value, int offset, int count)
         *           分配一个新的 String，它包含取自字符数组参数一个子数组的字符。
         *           offset:指定开始的索引
         *           count:指定的字符个数
         */
    2.字符串转换为字符数组
          char[] toCharArray()
                 将此字符串转换为一个新的字符数组
    3.大小写转换
    /**
     * String toLowerCase()
     *           使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
     * String toUpperCase()
     *           使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
     */
  e.String类的判断功能
    /**
     * boolean startsWith(String prefix)
     *        测试此字符串是否以指定的前缀开始。
     *
     * boolean endsWith(String suffix)
     *           测试此字符串是否以指定的后缀结束。
     *
     * public boolean contains(CharSequence s)
     *         当且仅当此字符串包含指定的 char 值序列时，返回 true。
     * public boolean equalsIgnoreCase(String anotherString)
     *      将此 String 与另一个 String 比较，不考虑大小写。如果两个字符串的长度相同，并且其中的相应字符都相等（忽略大小写），则认为这两个字符串是相等的。
     */
  f.String类的获取功能
    /**
     * int length()
     *           返回此字符串的长度
     *  String substring(int beginIndex, int endIndex)
     *           返回一个新字符串，它是此字符串的一个子字符串。
     */